<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Message Store Interceptor</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="interceptors.html">Interceptors</a>&nbsp;&gt;&nbsp;<a href="message-store-interceptor.html">Message Store Interceptor</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Message Store Interceptor</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=19580">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=19580">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=19580">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=19580">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=19580">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=19580">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><p>
An interceptor to store a ValidationAware action's messages / errors and field errors into
HTTP Session, such that it will be retrievable at a later stage. This allows the action's message /
errors and field errors to be available longer that just the particular HTTP request.
</p>

<p></p><p>
If no session exists, nothing will be stored and can be retrieved later. In other terms,
the application is responsible to open the session.
</p>

<p></p><p>
In the 'STORE' mode, the interceptor will store the ValidationAware action's message / errors
and field errors into HTTP session.
</p>

<p></p><p>
In the 'RETRIEVE' mode, the interceptor will retrieve the stored action's message / errors  and field
errors and put them back into the ValidationAware action.
</p>

<p></p><p>
In the 'AUTOMATIC' mode, the interceptor will always retrieve the stored action's message / errors 
and field errors and put them back into the ValidationAware action, and after Action execution, 
if the com.opensymphony.xwork2.Result is an instance of ServletRedirectResult, the action's message / errors
and field errors into automatically be stored in the HTTP session..
</p>

<p></p><p>
The interceptor does nothing in the 'NONE' mode, which is the default.
</p>

<p></p><p>
The operation mode could be switched using:<br clear="none">
1] Setting the interceptor parameter eg.
</p>
<pre>
  &lt;action name="submitApplication" ...&gt;
     &lt;interceptor-ref name="store"&gt;
        &lt;param name="operationMode"&gt;STORE&lt;/param&gt;
     &lt;/interceptor-ref&gt;
     &lt;interceptor-ref name="defaultStack" /&gt;
     ....
  &lt;/action&gt;
</pre>

<p></p><p>
2] Through request parameter (allowRequestParameterSwitch must be 'true' which is the default)
</p>

<p></p><pre>
  // the request will have the operation mode in 'STORE'
  http://localhost:8080/context/submitApplication.action?operationMode=STORE
</pre>


<h2 id="MessageStoreInterceptor-Parameters">Parameters</h2>


<p></p><ul><li>allowRequestParameterSwitch - To enable request parameter that could switch the operation mode
                                       of this interceptor. </li><li>requestParameterSwitch - The request parameter that will indicate what mode this
                                  interceptor is in. </li><li>operationMode - The operation mode this interceptor should be in
                         (either 'STORE', 'RETRIEVE', 'AUTOMATIC', or 'NONE'). 'NONE' being the default.</li></ul>


<h2 id="MessageStoreInterceptor-ExtendingtheInterceptor">Extending the Interceptor</h2>

<p></p><p>
The following method could be overridden:
</p>

<p></p><ul><li>getRequestOperationMode - get the operation mode of this interceptor based on the request parameters</li><li>mergeCollection - merge two collections</li><li>mergeMap - merge two map</li></ul>


<h2 id="MessageStoreInterceptor-Examples">Examples</h2>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;action name=&quot;submitApplication&quot; ....&gt;
   &lt;interceptor-ref name=&quot;store&quot;&gt;
     &lt;param name=&quot;operationMode&quot;&gt;aSTORE&lt;/param&gt;
   &lt;/interceptor-ref&gt;
   &lt;interceptor-ref name=&quot;defaultStack&quot; /&gt;
   &lt;result name=&quot;input&quot; type=&quot;redirect&quot;&gt;aapplicationFailed.action&lt;/result&gt;
   &lt;result type=&quot;dispatcher&quot;&gt;applicationSuccess.jsp&lt;/result&gt;
&lt;/action&gt;

&lt;action name=&quot;applicationFailed&quot; ....&gt;
   &lt;interceptor-ref name=&quot;store&quot;&gt;
      &lt;param name=&quot;operationMode&quot;&gt;RETRIEVE&lt;/param&gt;
   &lt;/interceptor-ref&gt;
   &lt;result&gt;applicationFailed.jsp&lt;/result&gt;
&lt;/action&gt;

]]></script>
</div></div>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
&lt;p&gt;
With the example above, &#39;submitApplication.action&#39; will have the action messages / errors / field errors stored
in the HTTP Session. Later when needed, (in this case, when &#39;applicationFailed.action&#39; is fired, it
will get the action messages / errors / field errors stored in the HTTP Session and put them back into
the action.
&lt;/p&gt;
]]></script>
</div></div></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
